import os


def process_file(filename):
    """
    处理给定文件，寻找特定的字节序列并进行数据交换和裁剪。

    参数:
    filename (str): 待处理的文件名。

    返回:
    无
    """
    # 目标字节序列，用于定位文件中的特定位置
    target_sequence = b'\xFF\xFF\xFF\x00\x00\x00\x00'

    # 以二进制模式打开文件并读取全部内容
    with open(filename, 'rb') as file:
        data = file.read()

    # 查找目标字节序列在文件数据中的位置
    position = data.find(target_sequence)

    # 如果找到了目标序列
    if position != -1:
        # 计算目标序列后特定偏移位置
        index_35 = position + 35
        index_38 = position + 38

        # 确保位置38在文件数据范围内
        if index_38 < len(data):
            # 读取位置35到38之间的数据
            value_35_to_38 = data[index_35:index_35 + 4]

            # 将读取的字节数据进行字节序反转并转换为整数
            swapped_value = int.from_bytes(value_35_to_38, byteorder='little')

            # 输出反转后的值
            print(f"Swapped value: {swapped_value:08X}")

            # 计算目标序列前一个位置
            check_index = position - 1

            # 确保check_index在文件数据范围内
            if check_index >= 0:
                # 读取check_index位置的字节值
                preceding_value = data[check_index]

                # 根据preceding_value的值决定要删除的字节数
                if preceding_value in (0xFF, 0xFC):
                    bytes_to_delete = 27
                else:
                    bytes_to_delete = 23

                # 裁剪文件数据并进行字节序反转
                new_data = data[:swapped_value] + data[swapped_value + bytes_to_delete:]

                # 创建输出目录
                output_dir = os.path.join(os.path.dirname(__file__), 'unlockedUpk')
                os.makedirs(output_dir, exist_ok=True)

                # 生成新的文件名
                new_filename = os.path.join(str(output_dir), os.path.basename(str(filename)).replace('.upk', '_upked.upk'))

                # 将处理后的数据写入新文件
                with open(new_filename, 'wb') as new_file:
                    new_file.write(new_data)

                # 输出文件保存信息
                print(f"File saved as {new_filename}.")
            else:
                # 如果check_index超出文件数据范围，则输出错误信息
                print("Preceding index is out of range.")
        else:
            # 如果位置35到38超出文件数据范围，则输出错误信息
            print("Indexes 35 to 38 are out of range.")
    else:
        # 如果未找到目标序列，则输出错误信息
        print("Sequence FF FF FF 00 00 00 00 not found in file.")


# 定义待处理文件的目录
unpacked_dir = os.path.join(os.path.dirname(__file__), 'unpacked')

# 遍历目录中的所有.upk文件并进行处理
for root, _, files in os.walk(unpacked_dir):
    for file in files:
        if file.endswith('.upk'):
            process_file(os.path.join(root, file))
